<?php

namespace App\traits;


trait JsonResult
{
    static $CODE_SUCCESS = 0;                //成功
    static $CODE_ERROR_INVALID = 1002;          //非法请求
    static $CODE_ERROR_PARAMS = 1003;           //参数错误
    static $CODE_ERROR_SIGN = 1004;             //签名无效
    static $CODE_ERROR_AUTH = 1005;             //认证错误
    static $CODE_ERROR_TIME = 1006;             //时间校验失败
    static $CODE_ERROR_NOMORE = 1007;           //没有更多数据了
    static $CODE_ERROR_NOEXIST = 1008;          //暂无数据
    static $CODE_ERROR_SELESE  = 1009;          //数据已存在不要重复添加
    //
    static $CODE_ERROR_UNKNOWN = 2001;          //未知错误
    //
    static $CODE_ERROR_SERVER = 3001;           //服务器错误

    public static $jrInstance  = null;

    /**
     * 返回单例
     * @return null|static
     */
    public static function jr(){
        if(!self::$jrInstance){
            self::$jrInstance =  new static();
        }
        return self::$jrInstance;
    }

    //默认返回的消息
    protected static $defaultMsgList = [
        0 => '操作成功',
        1002 => '非法请求',//（post & get 请求不正确）
        1003 => '参数错误',//具体是什么参数错误，可以在返回的时候输入msg参数
        1004 => '签名无效',//--基类
        1005 => '认证错误',//token 无效--基类
        1006 => '请求无效',//（时间校验失败）--基类
        1007 => '小编能力有限,就这些了',//（没有更多数据了，针对列表式加载更多）
        1008 => '暂无数据',//数据不存在
        1009 => '数据已存在',//数据已存在不要重复添加

        //2001 - 3000 客户端错误
        2001 => '未知错误',

        //3001 - 4000 服务器错误（用户自定义的错误，都应该在这个段）
        3001 => '服务器繁忙',
    ];

    /**
     * 定义返回json的数据
     * @param $code
     * @param $msg
     * @param $data  必须是个数组对象， 即： key => value 的方式
     * 0 正常
     * 1002 非法请求 （post & get 请求不正确）
     * 1003 参数错误
     * 1004 签名无效
     * 1005 token 无效
     * 1006 请求 无效（时间校验失败）
     * 1007 小编能力有限,就这些了（没有更多数据了）
     * 1008 => '暂无数据',//数据不存在
     *
     * 2001 - 3000 客户端错误
     * --- 自定义一些其他的前端错误
     * 2001 未知错误
     *
     * 3001 - 4000 服务器错误
     * --- 自定义服務端错误
     * 3001 服务器繁忙（服务器异常）
     *
     * 如果返回的
     * 如果没有传消息 即 $msg 为空，则自动匹配 默认消息 msg
     */
    protected $arrJson = [
        'code' => 0,
        'msg'  => '',
        'data' => [],
    ];

    /**
     * 响应 ajax 返回
     * @param string $array    其他返回参数(默认null)
     * @return mixed|string
     */
    protected function returnJson($array = null)
    {
        // 判断是否覆盖之前的值
        if ($array) {
            $this->arrJson = array_merge($this->arrJson, $array);
        }
        $code = $this->arrJson['code'];
        // 没有错误信息，就匹配默认的 code对应的 msg
        if (empty($this->arrJson['msg']) && isset(self::$defaultMsgList[$code])) {
            $this->arrJson['msg'] = self::$defaultMsgList[$code];
        }
        //指定消息返回的是 对象
        if(!$this->arrJson['data'] && is_array($this->arrJson['data'])){
            $this->arrJson['data'] = (object)[];
        }
        // 设置JSON返回
        return json_encode($this->arrJson);
    }

    /**
     * handleJson() 处理返回数据
     * @param mixed $data     返回数据
     * @param integer   $code  返回状态码
     * @param string  $msg   提示信息
     */
    protected function handleJson($data, $code = 0, $msg = '', $params = [])
    {
        $this->arrJson['code'] = $code;
        $this->arrJson['data']  = $data;
        $this->arrJson['msg'] = $msg;

        array_merge( $this->arrJson, $params);
    }

    /**
     * 处理成功返回
     *
     * @param mixed $data 返回结果信息
     * @param string $msg
     * @return mixed|string
     */
    protected function success($data = [], $msg = '', $params = [])
    {
        $arr = array_merge([
            'code' => self::$CODE_SUCCESS,
            'msg' => $msg,
            'data' => $data
        ], $params);
        return $this->returnJson($arr);
    }

    /**
     * 处理错误返回
     *
     * @param integer $code 错误码
     * @param string $message
     * @return mixed|string
     */
    protected function error( $msg = '', $code = 3001, $params = [])
    {
        $arr = array_merge([
            'code' => $code,
            'msg' => $msg,
        ], $params);
        return $this->returnJson($arr);
    }

    /**
     * 设置错误码
     *
     * @param int $errCode
     */
    public function setCode($code = 1003)
    {
        $this->arrJson['code'] = $code;
    }

    /**
     * 设置错误信息
     *
     * @param string $message
     */
    public function setMessage($message = '')
    {
        $this->arrJson['msg'] = $message;
    }




}